//package nancal.mp.mvc.ops
//
//import io.kubernetes.client.openapi.ApiClient
//import nancal.mp.db.mongo.JenkinsLanguageEnum
//import nancal.mp.db.mongo.JenkinsLanguageEnum.*
//import nancal.mp.db.mongo.entity.sys.K8sApiSyncSetting
//import nancal.mp.db.mongo.mor
//import nancal.mp.model.K8sAppServiceInfo
//import nancal.mp.model.K8sAppServiceStatusInfo
//import nancal.mp.model.replaceVarModel
//import nancal.mp.service.K8sBaseService
//import nancal.mp.service.K8sDeploymentService
//import nancal.mp.service.K8sIngressService
//import nancal.mp.service.K8sService
//import nancal.mp.util.tidyK8sYaml
//import nbcp.base.annotation.DefaultNumberValue
//import nbcp.base.comm.ApiResult
//import nbcp.base.comm.JsonMap
//import nbcp.base.comm.JsonResult
//import nbcp.base.comm.ListResult
//import nbcp.base.extend.AsString
//import nbcp.base.extend.FromJson
//import nbcp.base.extend.HasValue
//import nbcp.base.extend.ToYaml
//import nbcp.base.model.SshClient
//import nbcp.base.utils.StringUtil
//import nbcp.myoql.db.mongo.query
//import org.slf4j.LoggerFactory
//import org.springframework.beans.BeanUtils
//import org.springframework.beans.factory.annotation.Autowired
//import org.springframework.web.bind.annotation.PostMapping
//import org.springframework.web.bind.annotation.RequestMapping
//import org.springframework.web.bind.annotation.RequestMethod
//import org.springframework.web.bind.annotation.RestController
//import java.util.concurrent.TimeUnit
//import java.util.concurrent.locks.ReentrantLock
//
//
//@RequestMapping("/ops/k8s-api")
//@RestController
//class K8sApiSyncController {
//    companion object {
//        private var lock = ReentrantLock();
//        private val logger = LoggerFactory.getLogger(this::class.java.declaringClass)
//    }
//
//
//    @Autowired
//    private lateinit var k8sService: K8sService
//
//    @Autowired
//    lateinit var k8sDeployment: K8sDeploymentService;
//
//    data class K8sVersionStatus(
//        var version: String = "",
//        var replicas: Int = 0,
//        var readyReplicas: Int = 0,
//    )
//
//    data class SyncK8sServiceModel(
//        var uat: K8sVersionStatus = K8sVersionStatus(),
//        var prod: K8sVersionStatus = K8sVersionStatus()
//    ) : K8sAppServiceStatusInfo()
//
//
//    @RequestMapping("/list-test-prod", method = arrayOf(RequestMethod.POST, RequestMethod.GET))
//    fun listTestProd(
//        namespace: String,
//        name: String,
//        language: JenkinsLanguageEnum?,
//        isReady: Boolean?,
//        skip: Int,
//        @DefaultNumberValue(99) take: Int
//    ): ListResult<SyncK8sServiceModel> {
//        return listK8sTestService(namespace, name, language, isReady, skip, take)
//    }
//
//
//    private fun listK8sTestService(
//        namespace: String,
//        name: String,
//        language: JenkinsLanguageEnum?,
//        isReady: Boolean?,
//        skip: Int,
//        take: Int
//    ): ListResult<SyncK8sServiceModel> {
//        var syncSetting = mor.sys.k8sApiSyncSetting.query()
//            .where { it.isActive mongoEquals true }
//            .toEntity()!!;
//
//        var testK8s = K8sBaseService.getK8sClient("");
//
//        var testPods = k8sDeployment.list(
//            testK8s,
//            namespace,
//            name,
//            "",
//            isReady,
//            language,
//            "",
//            "",
//            skip,
//            take
//        );
//
//        var names = testPods.data.map { it.name }
//
//        var prodK8s = ApiClient();
//        prodK8s.setApiKeyPrefix("Bearer")
//        prodK8s.isVerifyingSsl = false;
//
//
//        prodK8s.basePath = syncSetting.apiServerHost
//        prodK8s.setApiKey(syncSetting.apiToken);
//
//
//        var prodPods = names.map {
//            var r = k8sDeployment.getDeploymentInfo(
//                prodK8s,
//                namespace,
//                it
//            )
//            if (r.hasError) {
//                return@map null;
//            }
//
//            return@map r.data!!
//        }.filter { it != null }
//
//        var model = testPods.data.map { row ->
//            var syncModel = SyncK8sServiceModel()
//            BeanUtils.copyProperties(row, syncModel)
//
//            var prod = prodPods.firstOrNull { it!!.name == row.name };
//
//            if (prod != null) {
//                syncModel.prod.version = prod.imageVersion.AsString()
//                syncModel.prod.replicas = prod.replicas
//                syncModel.prod.readyReplicas = prod.readyReplicas
//            }
//
//            return@map syncModel;
//        }
//
//        return ListResult.of(model, testPods.total)
//    }
//
//
//    @PostMapping("/fetch-prod-version")
//    fun fetchProdVersion(
//        namespace: String,
//        name: String
//    ): ApiResult<K8sAppServiceInfo> {
//        var syncSetting = mor.sys.k8sApiSyncSetting.query()
//            .where { it.isActive mongoEquals true }
//            .toEntity()!!;
//
//        var prodK8s = ApiClient();
//        prodK8s.basePath = syncSetting.apiServerHost.trimEnd('/')
//        prodK8s.setApiKey(syncSetting.apiToken);
//        prodK8s.setApiKeyPrefix("Bearer")
//        prodK8s.isVerifyingSsl = false;
//
//
//        return k8sDeployment.getDeploymentInfo(
//            prodK8s,
//            namespace,
//            name
//        );
//    }
//
//    @PostMapping("/get-prod-yaml")
//    fun getProdYaml(
//        namespace: String,
//        name: String
//    ): ApiResult<YamlModel> {
//        var syncSetting = mor.sys.k8sApiSyncSetting.query()
//            .where { it.isActive mongoEquals true }
//            .toEntity()!!;
//        var yamlResult = getSyncYml(syncSetting, namespace.AsString("default"), name)
//
//        if (yamlResult.hasError) {
//            return ApiResult.error(yamlResult.msg)
//        }
//
//        return yamlResult;
//    }
//
//    /**
//     * @param image 表示完整的 镜像名:版本号
//     */
//    @RequestMapping("/sync-to-prod", method = arrayOf(RequestMethod.POST, RequestMethod.GET))
//    fun syncToProd(
//        namespace: String,
//        name: String
//    ): JsonResult {
//        var result = false;
//        try {
//            result = lock.tryLock(1, TimeUnit.SECONDS)
//
//            if (!result) {
//                return JsonResult.error("当前任务正在执行，请稍后再试！");
//            }
//
//            var syncSetting = mor.sys.k8sApiSyncSetting.query()
//                .where { it.isActive mongoEquals true }
//                .toEntity()!!;
//            return doSyncYml(syncSetting, namespace.AsString("default"), name)
//        } finally {
//            if (result) {
//                lock.unlock();
//            }
//        }
//    }
//
//    @Autowired
//    lateinit var k8sIngressService: K8sIngressService
//
//
//    class YamlModel(
//        var deploymentYaml: String = "",
//        var serviceYaml: String = "",
//        var vpath: String = "",
//        var ingressYaml: String = ""
//    )
//
//    private fun getSyncYml(
//        syncSetting: K8sApiSyncSetting,
//        namespace: String,
//        name: String,
//        image: String = ""
//    ): ApiResult<YamlModel> {
//        var testK8s = K8sBaseService.getK8sClient("")
//
//        var deploymentResult = k8sDeployment.getDeploymentInfo(testK8s, namespace, name);
//        if (deploymentResult.hasError) {
//            return ApiResult.error(deploymentResult.msg)
//        }
//
//        var fullImageVersion = image.AsString(deploymentResult.data!!.fullImageVersion)
//
//
//        var language = deploymentResult.data!!.language
//        var svcName = name;
//        var appName = deploymentResult.data!!.appName;
//
//        if (language == null) {
//            return ApiResult.error("语言信息丢失")
//        }
//
//        var languageVersion = deploymentResult.data!!.languageVersion
//
//        if (languageVersion.isNullOrEmpty()) {
//            when (language) {
//                Java -> {
//                    languageVersion = "17"
//                }
//
//                Vue -> {
//                    languageVersion = "node18"
//                }
//
//                Node -> {
//                    languageVersion = "20"
//                }
//
//                Python -> {
//                    languageVersion = "3.12"
//                }
//
//                Nuxt -> TODO()
//                Php -> TODO()
//                Normal -> TODO()
//            }
//        }
//
//        var imgVer = fullImageVersion.split("/").last().split(":")
//
//        var vPath = deploymentResult.data!!.envs.get("vpath").AsString();
//        var maxMemory = syncSetting.languageSettings.first { it.language == language }.maxMemory.toString() + "Mi"
//
//        var varList = mutableMapOf<String, String>();
//
//        varList.put("namespace", namespace)
//        varList.put("vpath", vPath)
//        varList.put("language", language.toString())
//        varList.put("languageVersion", languageVersion)
//        varList.put("appName", appName)
//        varList.put("serviceName", svcName)
//        varList.put("image", imgVer.first())
//        varList.put("version", imgVer.last())
//        varList.put("max-memory", maxMemory)
//
//        deploymentResult.data!!.envs.forEach {
//            varList.put("env" + StringUtil.getBigCamelCase(it.key), it.value)
//        }
//
//
//        var langSetting = syncSetting.languageSettings.first { it.language == language }
//        var deploymentYaml = langSetting.languageVersionSettings
//            .firstOrNull { it.languageVersion == languageVersion }?.deploymentYaml.AsString {
//                langSetting.deploymentYaml
//            }
//
//        if (deploymentYaml.isNullOrEmpty()) {
//            throw RuntimeException("找不到生产环境 ${language} 的 Deployment 配置");
//        }
//
//        deploymentYaml = deploymentYaml.replaceVarModel(varList);
//
//
//        var ret = YamlModel(deploymentYaml);
//
//
//        var serviceYaml = langSetting.serviceYaml
//
//        if (serviceYaml.isNullOrEmpty()) {
//            throw RuntimeException("找不到生产环境 ${language} 的 ServiceYaml 配置")
//        }
//
//        serviceYaml = serviceYaml.replaceVarModel(varList);
//
//        ret.serviceYaml = serviceYaml;
//        ret.vpath = vPath;
//
//
//        if (vPath.replace("/", "").replace(".", "").HasValue) {
//            var prodK8s = ApiClient();
//            prodK8s.basePath = syncSetting.apiServerHost
//            prodK8s.setApiKey(syncSetting.apiToken);
//            prodK8s.setApiKeyPrefix("Bearer")
//            prodK8s.isVerifyingSsl = false;
//
//            var ingress = k8sIngressService.getAddVPath(
//                prodK8s,
//                namespace,
//                syncSetting.ingressName,
//                syncSetting.ingressHost,
//                vPath,
//                name
//            )
//
//            if (ingress != null) {
//                ret.ingressYaml = ingress.toJson().FromJson<JsonMap>()!!.tidyK8sYaml().ToYaml()
//            }
//        }
//
//
//        return ApiResult.of(ret);
//    }
//
//
//    private fun doSyncYml(
//        syncSetting: K8sApiSyncSetting,
//        namespace: String,
//        name: String,
//        image: String = ""
//    ): JsonResult {
//
//        var yamlResult = getSyncYml(syncSetting, namespace, name, image);
//        if (yamlResult.hasError) {
//            return JsonResult.error(yamlResult.msg)
//        }
//
//        var model = yamlResult.data!!
//
//        if (model.deploymentYaml.isNullOrEmpty()) {
//            throw RuntimeException("找不到 DeploymentYaml")
//        }
//
//
//        var prodK8s = ApiClient();
//        prodK8s.basePath = syncSetting.apiServerHost
//        prodK8s.setApiKey(syncSetting.apiToken);
//        prodK8s.setApiKeyPrefix("Bearer")
//        prodK8s.isVerifyingSsl = false;
//
//
//        //如果是第一次,则使用Yaml, 之后仅更新镜像.
//
//        var prodDep = k8sDeployment.getDeploymentInfo(prodK8s, namespace, name);
//        if (prodDep.data != null) {
//            var fullImageVersion = image.AsString(prodDep.data!!.fullImageVersion);
//            //仅更新镜像
//            return k8sDeployment.setImageName(prodK8s, namespace, name, fullImageVersion);
//        }
//
//        var applyResult = k8sDeployment.applyDeploymentYaml(
//            prodK8s,
//            namespace,
//            name,
//            model.deploymentYaml,
//            "",
//        )
//
//        if (applyResult.hasError) {
//            return JsonResult.error(applyResult.msg)
//        }
//
//
//        applyResult = k8sService.applyServiceYaml(
//            prodK8s,
//            namespace,
//            name,
//            model.serviceYaml
//        )
//        if (applyResult.hasError) {
//            return JsonResult.error(applyResult.msg)
//        }
//
//
//        if (model.vpath.replace("/", "").replace(".", "").HasValue) {
//            //applyIngress
//            k8sIngressService.addVPath(
//                prodK8s,
//                namespace,
//                syncSetting.ingressName,
//                syncSetting.ingressHost,
//                model.vpath,
//                name
//            )
//        }
//
//        return JsonResult()
//    }
//}